﻿using System;

namespace Lesson13_冒泡排序
{
    class Program
    {
        static void Main(string[] args)
        {
            #region 排序基本概念
            //排序是计算机内经常进行的一种操作 其目的是将一组 无序的记录序列 调整为 有序的记录序列
            //程序中 序列往往存储在数组中
            //所以 排序往往是对数组的排序
            #endregion

            #region 冒泡排序原理
            //两两相邻
            //不停比较
            //不停交换
            //比较n - 1轮(n为数组长度)
            #endregion

            #region 实例
            //申明一个待排序的数组
            int[] arr = new int[] { 1, 3, 5, 4, 2, 7, 8, 9, 6 };
            //进行升序排列

            bool isSort = false;
            int temp = 0;
            //总共排m - 1(m即数组长度)轮
            for (int m = 0; m < arr.Length - 1; m++)
            {
                //定义标识符表示是否要进入下一轮排序
                isSort = false;
                //优化一：比较完一轮，极值已经被排到了最边上，因此下一轮不需再参与比较，减m即可
                for (int n = 0; n < arr.Length - 1 - m; n++)
                {
                    if (arr[n] > arr[n + 1])
                    {
                        //优化二：若未比较到最后一轮就已排序完成，那么逻辑就不必再执行下去了，使用一个标识来解决
                        isSort = true;      //进入分支表示这轮排序中，排序并未完成，排序仍应继续
                        temp = arr[n];
                        arr[n] = arr[n + 1];
                        arr[n + 1] = temp;
                    }
                }
                //一轮排序结束后，判断是否排序是否仍要继续
                if (!isSort)
                {
                    break;
                }
            }

            //打印数组
            for (int i = 0; i < arr.Length; i++)
            {
                Console.WriteLine(arr[i]);
            }
            #endregion

            //冒泡排序模版
            //1.申明用于检测是否进入下轮排序的isSort 和 用于交换的临时变量
            //2.外层循环 进行arr.Length - 1轮
            //3.内层循环开始前将isSort置为false 每轮循环arr.Length - 1 - i 进入循环时将IsSort置为true 若满足判断条件 进行交换
            //4.内层循环结束后 通过IsSort判断循环是否要继续
            
        }
    }
}